//第一步:引入插件
import VueRouter from "vue-router";
//第二步：引入Vue
import Vue from "vue";
//第三步：使用插件
Vue.use(VueRouter);

import routes from '@/router/routes'

//注意:虽然是重写push|replace方法,最终实现路由跳转与传递参数，起始还是用人家原来的push方法

//先把人家原有备份一份--原始push
let originPush = VueRouter.prototype.push;

//备份原始replace
let originReplace = VueRouter.prototype.replace;

//重写push方法
VueRouter.prototype.push = function (location, resolve, reject) {
  //面试题:call与apply区别?
  //相同点:都可以让当前函数执行一次
  //不同点：call传递参数用逗号隔开，apply，传递参数数组
  //call第一个参数:this
  if (resolve && reject) {
    originPush.call(this, location, resolve, reject);
  } else {
    originPush.call(this, location, () => { }, () => { });
  }
}

//重写replace方法
VueRouter.prototype.replace = function (location, resolve, reject) {
  //判断
  if (resolve && reject) {
    originReplace.call(this, location, resolve, reject);
  } else {
    originReplace.call(this, location, () => { }, () => { });
  }
}


//箭头函数
const withRouter = () => {
  return new VueRouter({
    //一个路由器:管理多个路由
    routes,
    //滚动行为:当路由进行切换跳转的时候，可以设置滚动条的位置
    scrollBehavior() {
      //这里可以设置x轴，目前咱们项目没有x轴
      return { y: 0 };
    }
  })
}

// 引入仓库
import store from '@/store'

const router = withRouter();

// 全局守卫:用户它范围谁,守卫都需要查看一下

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
  // to[跳转到那里的那个路由对象] name, query, params,meta,path
  // from[从哪个路由而来,那个路由对象]
  // next:他并非是路由对象,他是一个函数.放行函数
  // next函数的调用写法:
  // 第一种:next(),路由跳转的时候放行!!!
  // 第二种写法:next('路径')

  // 判断用户是否登录---token [登录一定拥有token]
  let hasToken = store.state.user.token;
  // 不能通过空对象判断,因为空对象也是真的通过对象的属性有没有去判断
  let hasUserInfo = store.state.user.userInfo.loginName;
  
  // 用户登录
  if (hasToken) {
    // 用户登陆了还想去登录页!!
    if ( to.path=='/login'){
        next('/home')
    }else{
      // 去别的页面并非login
      if (hasUserInfo) {
          // 用户登录 去的不是login 有用户信息 在放行
          next();
      }else{
        try {
          // 用户登录但没有 用户信息 发请求
          await store.dispatch("getUserInfo");
          // 成功获取用户信息成功放行
          next();
        } catch (error) {
          await store.dispatch("logout");
          // 返回登录页
          next("/login")
        }
      }
    }
  } else {
    // 用户未登录:想去交易,支付,支付成功,个人中心->去登录页面
    let toPath=to.path;
    // 未登录想去:想去交易,支付,支付成功,个人中心->去登录页面
    if (toPath.indexOf("trade")!=-1 ||toPath.indexOf("pay")!=-1||toPath.indexOf("center")!=-1) {
      next('/login?redirect='+toPath);
    }else{
      // 未登录:去其他页面
      next();
    }
  }

})

//第四步：暴露VueRouter类的实例
export default router;